/**
* @file		sdk_port.h
* @brief	雅观智能网关第三方接口本地适配头文件
* @details	主要需要提供本地线程、socket和随机数的实现
* @author	shixian.gao@argrace.ai 
* @date		2023/11/24
* @version	v0.0.1
* @par	Copyright(c): Hangzhou Yaguan Technology Co. LTD
*/

#ifndef _SDK_PORT_H_
#define _SDK_PORT_H_

#include <sys/socket.h>
#include <pthread.h>


/** 线程本地接口ADT */
typedef pthread_t sdk_port_thread_t;

/** 
* @brief	sdk_port_random_get本地随机数获取接口
* @details	数据来源排序:硬件随机数 > 模拟随机数  > 时间戳  > 自加计数器
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_random_get(void);

/**
* @brief	sdk_port_udp_socket_create本地socket接口创建
* @details	实现本地udp socket描述符创建和端口绑定
* @param[in]	fd,udp socket描述符
* @param[in]	port，udp socket绑定的端口
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_udp_socket_create(int * fd,unsigned short port);

/**
* @brief	sdk_port_udp_socket_close本地udp socket关闭
* @details	实现本地udp socket关闭释放socket资源
* @param[in]	fd,udp socket描述符
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_udp_socket_close(int *sockfd);

/**
* @brief	sdk_port_socket_sendto本地udp socket发送接口
* @details	实现本地udp socket广播数据
* @param[in]	fd,udp socket描述符
* @param[in]	buf,发送缓冲区
* @param[in]	len,发送数据长度
* @param[in]	flags,调用flags,目前调用输入为0
* @param[in]	target_addr,目标地址结构
* @param[in]	target_len,目标结构数据长度
* @return	>0,发送出去数据的长度
* @return	-1-error
*/
extern int sdk_port_socket_sendto(int fd, const void *buf, long unsigned int len, int flags, const struct sockaddr *target_addr, unsigned int target_len);

/**
* @brief	sdk_port_socket_recvform本地udp socket接收数据接口
* @details	实现本地udp socket接收数据
* @param[in]	fd,udp socket描述符
* @param[in]	buf,接收缓冲区
* @param[in]	len,接收数据长度
* @param[in]	flags,调用flags,目前调用输入为0
* @param[in]	target_addr,数据源地址结构
* @param[in]	target_len,数据源结构数据长度
* @return	>0,接收出去数据的长度
* @return	-1-error
*/
extern int sdk_port_socket_recvform(int fd,void *buf, long unsigned int len, int flags,struct sockaddr *source_addr, unsigned int *source_len);

/**
* @brief	sdk_port_htonl本地转网络字节序
* @details	实现本地字节序到网络字节序转换
* @param[in]	hostlong主机字节序的数值,32位
* @return	根据参数返回的网络字节序数值
*/
extern unsigned int sdk_port_htonl(unsigned int hostlong);

/**
* @brief	sdk_port_htons本地转网络字节序
* @details	实现本地字节序到网络字节序转换
* @param[in]	n主机字节序的数值,16位
* @return	根据参数返回的网络字节序数值
*/
extern unsigned short sdk_port_htons(unsigned short n);

/**
* @brief	sdk_port_ntohs网络转本地字节序
* @details	实现网络字节序到本地字节序转换
* @param[in]	n主机字节序的数值,16位
* @return	根据参数返回的本地字节序数值
*/
extern unsigned short sdk_port_ntohs(unsigned short n);

/**
* @brief	sdk_port_inet_addr IP地址转换函数
* @details	实现网络地址从字符串转为网络字节序的地址
* @param[in]	n主机字节序的数值,32位
* @return	根据参数提供的字符串ip地址返回网络字节序32位的地址
*/
extern unsigned int sdk_port_inet_addr(const char *cp);

/**
* @brief	sdk_port_get_mac_addr 获取本地网卡MAC地址
* @details	此接口适配需要指定对应网卡
* @param[out]	mac_addr,13字节长度
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_get_mac_addr(unsigned char *mac_addr);

/**
* @brief	sdk_port_get_ip IP地址转换函数
* @details	此接口适配需要指定对应网卡
* @param[out]	ipstr,字符串缓冲区，长度16字节，最后一个字节为'\0'
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_get_ip(char *ipstr);

/**
* @brief	sdk_port_thread_create 本地线程创建接口
* @details	创建本地运行的线程,创建就运行
* @param[out]	thandle,线程句柄
* @param[in]	name,线程名字
* @param[in]	main_func,线程函数
* @param[in]	arg,线程函数运行参数
* @param[in]	stack_depth,栈深度,针对RTOS
* @param[in]	priority,线程优先级,针对RTOS
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_thread_create(sdk_port_thread_t *thandle, const char *name,void*(*main_func)(void *arg),void *arg,int stack_depth,int priority);

/**
* @brief	sdk_port_thread_delete 本地线程删除接口
* @details	释放本地线程，注意某些RTOS的释放规则
* @param[in]	thandle,线程句柄
* @return	0-ok
* @return	-1-error
*/
extern int sdk_port_thread_delete(sdk_port_thread_t *thandle);

/**
* @brief	sdk_port_thread_sleep 本地线程睡眠接口
* @details	切出本地线程一定时间，注意某些RTOS的规则
* @param[in]	mses,睡眠时间
* @return	0-ok
* @return	-1-error
*/
extern void sdk_port_thread_sleep(int mses);

/**
* @brief	sdk_port_thread_suspend 本地线程挂起接口
* @details	切出本地线程直到被调度，注意某些RTOS的规则
* @param[in]	thandle,线程句柄
* @return	0-ok
* @return	-1-error
*/
extern void sdk_port_thread_suspend(sdk_port_thread_t *thandle);

/**
* @brief	sdk_port_thread_resume 本地线程恢复调度接口
* @details	恢复本地线程调度，注意某些RTOS的规则
* @param[in]	thandle,线程句柄
* @return	0-ok
* @return	-1-error
*/
extern void sdk_port_thread_resume(sdk_port_thread_t *thandle);

/**
* @brief	sdk_port_printf打印函数适配
* @details	恢复本地线程调度，注意某些RTOS的规则
* @param[in]	fmt,参数格式表达式
* @return	>0,实际打印数据
* @return	-1-error
*/
extern int sdk_port_printf(const char *fmt,...);
#endif

